|
Windows è un Sistema Operativo (SO) basato sul concetto di GUI, basato quindi sul concetto di finestra, che tuttavia va ben oltre quello che è il significato immediato del termine e, come si vedrà in seguito, rappresenta il cuore delle funzionalità del sistema.
Esso è costituito da una struttura modulare, composta da un insieme di librerie ad aggancio dinamico (DLL), che nel loro insieme costituiscono la cosiddetta API, cioè l’interfaccia tra i software applicativi e il SO: Windows nasce infatti per superare il limite dei primi sistema a “pacchetti integrati”, questi sistemi partivano dall’idea di integrare, in un unico programma, diverse funzionalità come ad esempio quelle di un wordprocessor, di un foglio di calcolo, delle comunicazioni,ecc, questa situazione conduceva inevitabilmente al fatto che una di queste poteva non essere il top tra gli applicativi presenti sul mercato. Si è deciso di aggirare il problema proprio con la realizzazione di un SO che consentisse di lasciare l’utente libero di scegliere tra gli applicativi che più gli aggradano, occupandosi lui dell’integrazione tra loro e con la macchina.
Il cuore delle API è costituito da tre DLL:
- Kernel: gestore della memoria, della schedulazione dei processi;
- User: sistema di windowing;
- GDI: Graphic Device Interface;
una qualunque API si espande aggiungendo nuove DLL. In coerenza con quanto detto poco sopra, Windows fornisce una serie di servizi che spostano a livello di SO alcune operazioni in precedenza legate alle applicazioni, l’obiettivo è quello di rendere l’applicativo quanto più astratto possibile rispetto all’hardware presente sul pc. Un esempio di quanto detto è la GDI che tratta in maniera indistinta, mediante opportune mappe, sia i dispositivi di tipo video che le stampanti, non gravando chi usa gli applicativi, di doversi curare di distinguere tra i due sistemi. I sottosistemi che gestiscono questa attività sono basati sui driver.
Le DLL che vengono utilizzate da più sistemi, tipicamente le DLL di sistema, vengono carica in memoria una sola volta per tutte. Il concetto di librerie dinamiche è comune ai maggiori sistemi operativi.
Vi sono due modalità di aggancio delle librerie, una di tipo statico, effettuata all’avvio dell’applicazione, una di tipo dinamico che può avvenire in qualsiasi momento di funzionamento dell’applicazione mediante la LoadLibrary.
- Caricamento Statico: il linker inserisce nell’eseguibile le informazioni sulle DLL richieste e sulle funzioni da chiamare, il loader caricherà in memoria queste DLL, a meno che esse non siano già presenti, ed esegue i link tra di esse;
- Caricamento Dinamico: non vi è alcuna indicazione sulle DLL da utilizzare sia sul linker che sul loader. Il caricamento e l’aggancio vengono fatti chiamando esplicitamente due funzioni delle API, cioè la LoadLibrary e la GetProcAddress: la prima prende come parametro il nome della DLL e la carica restituendo un handle. La seconda prende come parametri l’handle appena restituito e il nome di una funzione, restituendo un puntatore alla funzione stessa. Alla fine sarà necessario chiamare la funzione FreeLibrary per scaricare la DLL.
Le impostazioni tradizionali prevedevano che fosse l’applicazione stessa a gestire il flusso per la maggior parte del tempo, chiamando il SO solo quando aveva bisogno di un servizio: in Windows questo approccio è del tutto rovesciato e sarà appunto il SO a chiamare l’applicazione quando necessario, si parlerà allora di “chiamate ad eventi”. Questo approccio è detto “Don’t call me I call you” (Hollywood Model).
| |
|
|